/**  
* @description
* @author  wangshiwei  
* @date   2018年6月22日    
*/  
package com.oren.config;

import java.lang.annotation.Annotation;
import java.util.HashSet;
import java.util.Set;

import com.oren.annotation.WswController;
import com.oren.annotation.WswRepository;
import com.oren.util.ClassUtil;
import com.oren.annotation.WswService;

/**  
* @description
* @author  wangshiwei  
* @date   2018年6月22日 上午11:15:21
    
*/
public final class ClassHelper {
	
	//定义类集合（用于存放所加载的类）
	private static final Set<Class<?>> CLASS_SET;
	
	static {
		
		String basePackage=ConfigHelper.getBasePackgae();
		CLASS_SET= ClassUtil.getClassSet(basePackage);
	};
	
	/**
	 * 获取包下面的所有的类
	 * @return
	 */
	public static Set<Class<?>> getClassSet(){
		return CLASS_SET;
	}


	/**
	 * 获取所有的Repository的注解类
	 * @return
	 */
	public static Set<Class<?>> getRepository(){
		Set<Class<?>> classSet=new HashSet<Class<?>>();
		for(Class<?> cls:CLASS_SET) {
			if(cls.isAnnotationPresent(WswRepository.class)) {
				classSet.add(cls);
			}
		}
		return classSet;
	}

	
	/**
	 * 获取所有的service的注解类
	 * @return
	 */
	public static Set<Class<?>> getServiceClassSet(){
		Set<Class<?>> classSet=new HashSet<Class<?>>();
		for(Class<?> cls:CLASS_SET) {
			if(cls.isAnnotationPresent(WswService.class)) {
				/*Class<?> interfaces[] = cls.getInterfaces();//获得Dog所实现的所有接口
				if(interfaces!=null && interfaces.length>0){
					for (Class cls1:interfaces) {
						classSet.add(cls1);
					}
				}*/
				classSet.add(cls);
			}
		}
		return classSet;
	}

	/**
	 * 获取所有的controller的注解类
	 * @return
	 */
	public static Set<Class<?>> getControllerClassSet(){
		Set<Class<?>> classSet=new HashSet<Class<?>>();
		for(Class<?> cls:CLASS_SET) {
			if(cls.isAnnotationPresent(WswController.class)) {
				classSet.add(cls);
			}
		}
		return classSet;
	}
	
	
	/**
	 * 获取所有的controller的注解类
	 * @return
	 */
	public static Set<Class<?>> getBeanClassSet(){
		Set<Class<?>> classSet=new HashSet<Class<?>>();
		classSet.addAll(getServiceClassSet());
		classSet.addAll(getControllerClassSet());
		classSet.addAll(getRepository());
		return classSet;
	}

	/**
	 * 获取应用包下面某个父类或者接口的所有子类或者实现类
	 * @param superClass
	 * @return
	 */
	public static Set<Class<?>> getClassSetBySuper(Class<?> superClass){
		Set<Class<?>> classeSet=new HashSet<Class<?>>();
		for (Class<?> cls: CLASS_SET) {
			if(superClass.isAssignableFrom(cls)&& !superClass.equals(cls)){
				classeSet.add(cls);
			}
		}
		return classeSet;
	}

	/**
	 * 获取应用包下的所有带有某类注解的所有类
	 * @param annotionClass
	 * @return
	 */
	public static Set<Class<?>> getClassSetByAnnotation(Class<? extends Annotation> annotionClass){
		Set<Class<?>> classSet=new HashSet<Class<?>>();
		for (Class<?> cls:CLASS_SET) {
			if(cls.isAnnotationPresent(annotionClass)){
				classSet.add(cls);
			}
		}
		return classSet;
	}

}
